package client_server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 服务器类，用于创建一个简单的服务器，等待客户端连接并处理请求。
 */
public class Server {
    private ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    /**
     * 程序入口点。
     * @param args 命令行参数（未使用）
     */
    public static void main(String[] args) {
        Server server = new Server();
        try {
            server.fun();

        } catch (IOException e) {
            // 打印异常信息，保留IOException的原始类型
            e.printStackTrace();
        }finally {
            server.shutdown();
        }
    }

    /**
     * 创建服务器端口并等待客户端连接，接收到消息后打印出来。
     * @throws IOException 如果发生输入/输出错误
     */
    private void fun() throws IOException {
        // 创建服务端Socket对象，监听6677端口
        ServerSocket ss = new ServerSocket(6677);
        System.out.println("服务端已开启等待客户端连接....");

        while(true){
            // 等待客户端连接
            Socket socket = ss.accept();
            // 使用线程池处理客户端通信
            executorService.execute(() -> handleClientConnection(socket));
        }
    }

    /**
     * 处理客户端连接的方法。
     * @param socket 与客户端建立的Socket连接
     */
    private void handleClientConnection(Socket socket) {
        try {
            // 获取客户端IP地址
            String ip = socket.getInetAddress().getHostAddress();
            // 通过Socket对象获取输入流
            try (InputStream in = socket.getInputStream();
                 BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
                String readLine;
                while ((readLine = br.readLine()) != null) {
                    // 打印接收到的消息
                    System.out.println(ip + ":" + readLine);
                }
            }
        } catch (IOException e) {
            // 使用日志记录异常信息，这里简单使用System.err.println代替
            System.err.println("处理客户端连接时发生异常: " + e.getMessage());
        } finally {
            // 尝试关闭Socket
            try {
                if (socket != null && !socket.isClosed()) {
                    socket.close();
                }
            } catch (IOException e) {
                // 异常处理，记录或打印日志
                e.printStackTrace();
            }
        }
    }

    // 程序退出时，关闭线程池
    public void shutdown() {
        executorService.shutdown();
        try {
            if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
                executorService.shutdownNow(); // 取消当前执行的任务
            }
        } catch (InterruptedException e) {
            executorService.shutdownNow();
            Thread.currentThread().interrupt(); // 恢复中断状态
        }
    }
}


